package modelo.bd.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.bd.ConexionPool;
import modelo.bd.excepcion.DAOException;

public class ReporteDAO { //extends AbstractDAO<String[]> {

    private String query;

    public List<String[]> selectReportes(Integer area, String tipo, String fechaInicio, 
            String fechaFin) throws DAOException {
        Connection conexion = null;
        CallableStatement sentencia = null;
        ResultSet resultado = null;
        List<String[]> resultados = null;
        try {
            query = "{call SSMA_REPORTE_P(" + area + ", '" + tipo + "', '" + fechaInicio + "', '" + fechaFin + "')}";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareCall(query);
            sentencia.execute();
            resultado = sentencia.getResultSet();
            int columnas = resultado.getMetaData().getColumnCount();
            resultados = new ArrayList<String[]>();
            //primer elemento trae el nombre de las columnas
            String[] cols = new String[columnas];
            for (int i = 1; i <= columnas; i++) {
                cols[i - 1] = resultado.getMetaData().getColumnName(i);
            }
            resultados.add(cols);
            //elementos posteriores son registros
            while (resultado.next()) {
                String[] registro = new String[columnas];
                for (int i = 1; i <= columnas; i++) {
                    registro[i - 1] = resultado.getString(i);
                }
                resultados.add(registro);
            }
        } catch (SQLException ex) {
            throw new DAOException("1 REDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("2 REDS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }

    public List<String[]> selectTiposReporte() throws DAOException {
        Connection conexion = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        List<String[]> resultados = null;
        try {
            query = "SELECT VALOR "
                  + "FROM   SSMA_LISTA_VALORES_T "
                  + "WHERE  TIPO = 'RP'";
            conexion = ConexionPool.getInstancia().getConexion();
            sentencia = conexion.prepareStatement(query);
            resultado = sentencia.executeQuery();
            int columnas = resultado.getMetaData().getColumnCount();
            resultados = new ArrayList<String[]>();
            //elementos posteriores son registros
            while (resultado.next()) {
                String[] registro = new String[columnas];
                for (int i = 1; i <= columnas; i++) {
                    registro[i - 1] = resultado.getString(i);
                }
                resultados.add(registro);
            }
        } catch (SQLException ex) {
            throw new DAOException("3 REDS-SQL " + ex.getMessage());
        } finally {
            try {
                if (resultado != null) {
                    resultado.close();
                }
                if (sentencia != null) {
                    sentencia.close();
                }
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                throw new DAOException("4 REDS-SQL " + ex.getMessage());
            }
        }
        return resultados;
    }
}
